// function a(){
//   function b(){
//     var bb = 234
//   }
//   var aaa = 123
//   return bb
// }
// a()
//Uncaught ReferenceError: bb is not defined
// 这个bb在 a的作用域里面没有bb的定义


function a(){
  function b(){
    var bb = 234
    document.write(aaa)
  }
  var aaa = 123
  return b
}

// var demo = a()
// demo()
// ab执行上下文.jpeg 看图即明白

//在看下面
function a1(){
  var num = 100
  function b1(){
    num ++
    document.write(num)
  }

  return b1
}
// var demo1 = a1()
// demo1()//
// 第一次执行demo1   aAO{num : 101}  销毁bAO{}
// 第二次执行demo1   生成新的bAO{} bAO里面的num 没有 他往aAO里面找到num
// 再看看下面这么执行
a1()

a1()()
a1()()
a1()()
// a1()执行完 销毁掉aAO{}
// a1()()这么执行其实每次都是先执行 aAO bAO
// demo1 这个被 defined 的时候 aAO{} 被保存
var demo1 = a1()
console.dir(demo1)
demo1()
demo1()
demo1()
// 这时候我们可以这么说 demo1


// 内存泄漏  Closure

function closure(params) {
  var num = 100;
    function a(){
      num++;
      console.log(num)
    }
    function b(){
      num--;
      console.log(num)
    }
  return [a,b]
}
var myArr = closure()
myArr[0]()
myArr[1]()

// 
closure()[0]();
closure()[1]();


function test2 (){
 
  // console.log('立即执行函数')
  +function test2_1(){
    console.log('立即执行函数测试')
  }()
  this.cc = 1
  this.dd = 2
  // return cc + dd
}
// }());
var test2_pro = new test2()

console.dir(test2)
console.dir(test2_pro)
// a || function name(params) {
  
// }()

function testArray() {
  var arr = []
  let i = 0
  for(i=0;i<10;i++){// let 0-9  var// 10 个 10  // 具体i在哪个执行上下文
    (function (j){
      console.log(j)
      arr[j] = function(){
        this.num = j
        console.log(j+"")
      }
    })(i)
  
    
  }

  console.log(arr)
  return arr
}
var myArray = testArray()
console.dir(myArr)
for(var j = 0;j<10;j++){
  myArray[j]()
}


function ClosureClass (){
  var count = 0
    function increase(){
      count++
      console.log(count)
    }
    function decrease(){
      count--
      console.log(count)
    }
    // return count
    return [increase,decrease]
}
var closure = ClosureClass()

closure[0]()
closure[0]()
closure[0]()
closure[1]()
console.log(closure)

// let liData = document.querySelector('ul li')
// liData.addEventListener('click',function(e){
//   console.log(e.srcElement.innerText)
//   console.log(e)
// })
list = document.getElementsByTagName('li')
for(var i = 0; i < list.lengt h; i++){
    list[i].onclick = function(i,a,b){
        console.log(i)
        console.log(a)
        console.log(b)
    }.bind(list[i],i)
}
// 
var c = 1;
var type1 = (
  function increase(){
    c++
    console.log(c)
  },
  function decrease(){
    c--
    console.log(c)
  }
)
console.dir(type1)